﻿// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

using System.Collections.Generic;

namespace Microsoft.PowerFx.Tests.IntellisenseTests
{
    internal class StringInterpolationTestCases
    {
        private static readonly IEnumerable<TokenizationTestCase> StringInterpTestCases = new List<TokenizationTestCase>
        {
            TokenizationTestCase.Create(
                "$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken()),

            TokenizationTestCase.Create(
                "$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}\";$\"Another string interpolation\";$\"\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateVaridicOpToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateStrLitToken("Another string interpolation"),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIgnoredPlaceholderToken(1),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateStringInterpEndToken()),

            TokenizationTestCase.Create(
                "$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}{$\"Another nested\"}\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateStrLitToken("Another nested"),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken()),

            TokenizationTestCase.Create(
                "$\"1+2={$\"3\"}{$\"}\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateStrLitToken("1+2="),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateStrLitToken(1),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIgnoredPlaceholderToken(1),
                ExpectedToken.CreateStringInterpEndToken()),

            TokenizationTestCase.Create(
                "$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}\";$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}\";$\"{$\"{$\"{$\"{.12e4}\"}\"}\"}\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateVaridicOpToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIgnoredPlaceholderToken(1),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateStringInterpStartToken(),
                ExpectedToken.CreateIslandStartToken(),
                ExpectedToken.CreateNumLitToken(5),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken(),
                ExpectedToken.CreateIslandEndToken(),
                ExpectedToken.CreateStringInterpEndToken()),

            TokenizationTestCase.Create(
                "$\"\"",
                ExpectedToken.CreateStringInterpStartToken(0),
                ExpectedToken.CreateStringInterpEndToken()),
        };

        public static IEnumerable<object[]> StringInterpTestCasesAsObjects => TokenizationTestCase.TestCasesAsObjectsArray(StringInterpTestCases);
    }
}
